package br.ucb.modelo.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.List;

import br.ucb.exceptions.PersistenceException;
import br.ucb.modelo.negocio.ItemEstoque;
import br.ucb.modelo.negocio.Produto;
import br.ucb.service.ListFactory;
import br.ucb.service.Servicos;

public class ProdutoDAO implements DAO <Produto>{

	@Override
	public int insert(Produto produto) throws PersistenceException {
		String sql = "insert into produto(nome, preco, tempoUso, descricao, idBazar, status, imagem ,quantidadeEstoque) values(?, ?, ?, ?, ?, ?, ?, ?)";
		Connection con;
		PreparedStatement stmt;
		int linhas = 0;
		try {
			con = ConnectionFactory.getConnection();
			stmt = con.prepareStatement(sql);
			stmt.setString(1, produto.getNome());
			stmt.setFloat(2, produto.getPreco());
			stmt.setString(3, produto.getTempoUso().toString());
			stmt.setString(4, produto.getDescricao());
			stmt.setLong(5, produto.getIdBazar());
			stmt.setString(6, produto.getStatus());
			stmt.setBytes(7, produto.getImagem());
			stmt.setInt(8, produto.getQuantidadeEstoque());
			linhas = stmt.executeUpdate();
			stmt.close();
			ConnectionFactory.close();
		} catch(SQLException e) {
		  	ConnectionFactory.close();
			e.printStackTrace();
			throw new PersistenceException();
		}
		return linhas;
	}

	@Override
	public int update(Produto produto) throws PersistenceException {
		String sql = "update produto set nome=?, preco=?, tempoUso=?, descricao=?, imagem=?, quantidadeEstoque=? where id=?";
		Connection con;
		PreparedStatement stmt;
		int linhas = 0;
		try {
			con = ConnectionFactory.getConnection();
			stmt = con.prepareStatement(sql);
			stmt.setString(1, produto.getNome());
			stmt.setFloat(2, produto.getPreco());
			stmt.setString(3, produto.getTempoUso().toString());
			stmt.setString(4, produto.getDescricao());
			stmt.setBytes(5, produto.getImagem());
			stmt.setInt(6, produto.getQuantidadeEstoque());
			stmt.setLong(7, produto.getId());
			linhas = stmt.executeUpdate();
			stmt.close();
			ConnectionFactory.close();
		} catch(SQLException e) {
		  	ConnectionFactory.close();
			e.printStackTrace();
			throw new PersistenceException();
		}
		return linhas;
	}

	@Override
	public int delete(Long id) throws PersistenceException {
		String sql = "delete from produto where id=?";
		Connection con;
		PreparedStatement stmt;
		int linhas = 0;
		try {
			con = ConnectionFactory.getConnection();
			stmt = con.prepareStatement(sql);
			stmt.setLong(1, id);
			linhas = stmt.executeUpdate();
			stmt.close();
			ConnectionFactory.close();
		} catch(SQLException e) {
		  	ConnectionFactory.close();
			e.printStackTrace();
			throw new PersistenceException();
		}
		return linhas;
	}

	@Override
	public Produto findByID(Long id) throws PersistenceException {
		String sql = "select * from produto where id=?";
		Connection con;
		PreparedStatement stmt;
		Produto produto = null;
		try {
			con = ConnectionFactory.getConnection();
			stmt = con.prepareStatement(sql);
			stmt.setLong(1, id);
			ResultSet rs = stmt.executeQuery();
			if(rs.first())
				produto = Servicos.putProduto(rs);
			stmt.close();
			ConnectionFactory.close();
		} catch(SQLException e) {
		  	ConnectionFactory.close();
			e.printStackTrace();
			throw new PersistenceException();
		}
		return produto;
	}

	@Override
	public List<Produto> findAll() throws PersistenceException {
		Connection con;
		List <Produto> produtos = ListFactory.getDefaultListProduto();
		Statement stmt;
		String sql = "select * from produto order by nome";
		try {
			con = ConnectionFactory.getConnection();
			stmt = con.createStatement();
			ResultSet rs = stmt.executeQuery(sql);
			while(rs.next()) {
			   Produto produto = Servicos.putProduto(rs);
			   produtos.add(produto);
			}
			stmt.close();
		} catch (SQLException e) {
			ConnectionFactory.close();
			e.printStackTrace();
			throw new PersistenceException();
		}
		ConnectionFactory.close();
		return produtos;
	}
	
	public List<Produto> findByIdBazar(Long idBazar) throws PersistenceException {
		String sql = "select * from produto where idBazar=? order by produto.nome";
		Connection con;
		PreparedStatement stmt;
		List<Produto> produtos = ListFactory.getDefaultListProduto();
		try {
			con = ConnectionFactory.getConnection();
			stmt = con.prepareStatement(sql);
			stmt.setLong(1, idBazar);
			ResultSet rs = stmt.executeQuery();
			while(rs.next()) {
				Produto produto = Servicos.putProduto(rs);
				produtos.add(produto);
			}
			stmt.close();
			ConnectionFactory.close();
		} catch(SQLException e) {
		  	ConnectionFactory.close();
			e.printStackTrace();
			throw new PersistenceException();
		}
		return produtos;
	}
	
	public int deleteByIdBazar(Long idBazar) throws PersistenceException {
		String sql = "delete from produto where idBazar=?";
		Connection con;
		PreparedStatement stmt;
		int linhas = 0;
		try {
			con = ConnectionFactory.getConnection();
			stmt = con.prepareStatement(sql);
			stmt.setLong(1, idBazar);
			linhas = stmt.executeUpdate();
			stmt.close();
			ConnectionFactory.close();
		} catch(SQLException e) {
		  	ConnectionFactory.close();
			e.printStackTrace();
			throw new PersistenceException();
		}
		return linhas;
	}
	
	public List<ItemEstoque> findAllProdutosVenda() throws PersistenceException {
		String sql = "select produto.id,produto.imagem, produto.nome, "
				+ "produto.preco,produto.descricao, "
				+ "produto.tempoUso, produto.quantidadeEstoque,usuario.nome, usuario.id "
				+ "from produto,usuario, bazarUsuario where "
				+ "produto.idBazar = bazarusuario.id and "
				+ "bazarusuario.idUser = usuario.id and "
				+ "produto.status='Disponivel' order by produto.nome";
		Connection con;
		PreparedStatement stmt;
		List<ItemEstoque> itens = ListFactory.getDefaultListItems();
		try {
			con = ConnectionFactory.getConnection();
			stmt = con.prepareStatement(sql);
			ResultSet rs = stmt.executeQuery();
			while(rs.next()) {
				ItemEstoque item = Servicos.putItem(rs);
				itens.add(item);
			}
			stmt.close();
			ConnectionFactory.close();
		} catch(SQLException e) {
		  	ConnectionFactory.close();
			e.printStackTrace();
			throw new PersistenceException();
		}
		return itens;
	}
	
	public List<ItemEstoque> findProdutosOutros(Long id) throws PersistenceException {
		String sql = "select produto.id,produto.imagem, produto.nome, "
				+ "produto.preco,produto.descricao, "
				+ "produto.tempoUso, produto.quantidadeEstoque, usuario.nome, usuario.id "
				+ "from produto,usuario, bazarUsuario "
				+ "where produto.idBazar = bazarusuario.id and "
				+ "bazarusuario.idUser = usuario.id and "
				+ "produto.status='Disponivel' and bazarUsuario.idUser != ? order by produto.nome";
		Connection con;
		PreparedStatement stmt;
		List<ItemEstoque> itens = ListFactory.getDefaultListItems();
		try {
			con = ConnectionFactory.getConnection();
			stmt = con.prepareStatement(sql);
			stmt.setLong(1, id);
			ResultSet rs = stmt.executeQuery();
			while(rs.next()) {
				ItemEstoque item = Servicos.putItem(rs);
				itens.add(item);
			}
			stmt.close();
			ConnectionFactory.close();
		} catch(SQLException e) {
		  	ConnectionFactory.close();
			e.printStackTrace();
			throw new PersistenceException();
		}
		return itens;
	}
	
	public int updateStatusCompra(Long id, String status) throws PersistenceException {
		String sql = "update produto set status=? where id=?";
		Connection con;
		PreparedStatement stmt;
		int linhas = 0;
		try {
			con = ConnectionFactory.getConnection();
			stmt = con.prepareStatement(sql);
			stmt.setString(1, status);
			stmt.setLong(2, id);
			linhas = stmt.executeUpdate();
			stmt.close();
			ConnectionFactory.close();
		} catch(SQLException e) {
		  	ConnectionFactory.close();
			e.printStackTrace();
			throw new PersistenceException();
		}
		return linhas;
	}
	
	public int updateStatus(Long id, String status) throws PersistenceException {
		String sql = "update produto set status=? where id=?";
		Connection con;
		PreparedStatement stmt;
		int linhas = 0;
		try {
			con = ConnectionFactory.getConnection();
			stmt = con.prepareStatement(sql);
			stmt.setString(1, status);
			stmt.setLong(2, id);
			linhas = stmt.executeUpdate();
			stmt.close();
			ConnectionFactory.close();
		} catch(SQLException e) {
		  	ConnectionFactory.close();
			e.printStackTrace();
			throw new PersistenceException();
		}
		return linhas;
	}

}
